gint min_display_width;
gint min_display_height;
- /* Sub windows */
- GdkWindow *bin_window;
-
/* CSS nodes */
GtkCssNode *header_node;
gtk_widget_map (child->widget);
}
}
- gdk_window_show (tree_view->priv->bin_window);
gtk_tree_view_map_buttons (tree_view);
}
static void
gtk_tree_view_realize (GtkWidget *widget)
{
- GtkAllocation allocation;
GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
GList *tmp_list;
GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->realize (widget);
- gtk_widget_get_allocation (widget, &allocation);
-
- /* Make the window for the tree */
- tree_view->priv->bin_window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
- GDK_ALL_EVENTS_MASK,
- &(GdkRectangle) {
- 0,
- gtk_tree_view_get_effective_header_height (tree_view),
- MAX (tree_view->priv->width, allocation.width),
- allocation.height});
- gtk_widget_register_window (widget, tree_view->priv->bin_window);
-
- tmp_list = tree_view->priv->children;
- while (tmp_list)
- {
- GtkTreeViewChild *child = tmp_list->data;
- tmp_list = tmp_list->next;
-
- gtk_widget_set_parent_window (child->widget, tree_view->priv->bin_window);
- }
for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next)
_gtk_tree_view_column_realize_button (GTK_TREE_VIEW_COLUMN (tmp_list->data));
for (list = priv->columns; list; list = list->next)
_gtk_tree_view_column_unrealize_button (GTK_TREE_VIEW_COLUMN (list->data));
- gtk_widget_unregister_window (widget, priv->bin_window);
- gdk_window_destroy (priv->bin_window);
- priv->bin_window = NULL;
-
if (priv->drag_window)
{
gtk_widget_unregister_window (widget, priv->drag_window);
if (gtk_widget_get_realized (widget))
{
- gdk_window_move_resize (tree_view->priv->bin_window,
- - (gint) gtk_adjustment_get_value (tree_view->priv->hadjustment),
- gtk_tree_view_get_effective_header_height (tree_view),
- MAX (tree_view->priv->width, allocation->width),
- allocation->height - gtk_tree_view_get_effective_header_height (tree_view));
-
if (tree_view->priv->tree == NULL)
invalidate_empty_focus (tree_view);
gtk_tree_view_invalidate_bin_region (GtkTreeView *tree_view,
cairo_region_t *region)
{
- GtkAllocation allocation;
-
- cairo_region_intersect_rectangle (region,
- &(GdkRectangle) { 0, 0,
- gdk_window_get_width (tree_view->priv->bin_window),
- gdk_window_get_height (tree_view->priv->bin_window)});
-
- gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
- cairo_region_translate (region,
- allocation.x - (gint) gtk_adjustment_get_value (tree_view->priv->hadjustment),
- allocation.y + gtk_tree_view_get_effective_header_height (tree_view));
-
- gtk_widget_queue_draw_region (GTK_WIDGET (tree_view), region);
-
- cairo_region_destroy (region);
+ gtk_widget_queue_draw (GTK_WIDGET (tree_view));
}
static void
gtk_tree_view_invalidate_bin_area (GtkTreeView *tree_view,
const GdkRectangle *rect)
{
- cairo_region_t *region = cairo_region_create_rectangle (rect);
-
- gtk_tree_view_invalidate_bin_region (tree_view, region);
+ gtk_tree_view_invalidate_bin_region (tree_view, NULL);
}
static void
static void
invalidate_empty_focus (GtkTreeView *tree_view)
{
- GdkRectangle area;
-
if (!gtk_widget_has_focus (GTK_WIDGET (tree_view)))
return;
- area.x = 0;
- area.y = 0;
- area.width = gdk_window_get_width (tree_view->priv->bin_window);
- area.height = gdk_window_get_height (tree_view->priv->bin_window);
- gtk_tree_view_invalidate_bin_area (tree_view, &area);
+ gtk_widget_queue_draw (GTK_WIDGET (tree_view));
}
/* Draws background and a focus rectangle near the edge of the bin_window;
if (gtk_widget_has_visible_focus (widget))
{
- gtk_snapshot_render_focus (snapshot, context,
- 0, 0,
- gdk_window_get_width (tree_view->priv->bin_window),
- gdk_window_get_height (tree_view->priv->bin_window));
+ int width, height;
+
+ gtk_widget_get_content_size (widget, &width, &height);
+ gtk_snapshot_render_focus (snapshot, context, 0, 0, width, height);
}
}
return;
}
- bin_window_width = gdk_window_get_width (tree_view->priv->bin_window);
- bin_window_height = gdk_window_get_height (tree_view->priv->bin_window);
+ gtk_widget_get_content_size (GTK_WIDGET (tree_view), &bin_window_width, &bin_window_height);
+
clip = (GdkRectangle) { 0, 0, bin_window_width, bin_window_height };
new_y = TREE_WINDOW_Y_TO_RBTREE_Y (tree_view, clip.y);
y_offset = -_gtk_rbtree_find_offset (tree_view->priv->tree, new_y, &tree, &node);
if (drag_tree != NULL)
gtk_snapshot_render_frame (snapshot, context,
0, gtk_tree_view_get_row_y_offset (tree_view, drag_tree, drag_node),
- gdk_window_get_width (tree_view->priv->bin_window),
+ bin_window_width,
gtk_tree_view_get_row_height (tree_view, drag_node));
gtk_style_context_restore (context);
gtk_snapshot_render_focus (snapshot, context,
0, tmp_y,
- gdk_window_get_width (tree_view->priv->bin_window),
+ bin_window_width,
tmp_height);
gtk_style_context_restore (context);
GtkRBNode *node;
gint new_y;
- /* Sanity check it */
- if (event->window != tree_view->priv->bin_window)
- return FALSE;
-
if (tree_view->priv->tree == NULL)
return FALSE;
tree_view->priv->children = g_list_append (tree_view->priv->children, child);
- if (gtk_widget_get_realized (GTK_WIDGET (tree_view)))
- gtk_widget_set_parent_window (child->widget, tree_view->priv->bin_window);
-
gtk_widget_set_parent (child_widget, GTK_WIDGET (tree_view));
}
gint dy;
gtk_widget_get_allocation (GTK_WIDGET (tree_view), &allocation);
- gdk_window_move (tree_view->priv->bin_window,
- allocation.x - gtk_adjustment_get_value (tree_view->priv->hadjustment),
- allocation.y + gtk_tree_view_get_effective_header_height (tree_view));
dy = tree_view->priv->dy - (int) gtk_adjustment_get_value (tree_view->priv->vadjustment);
- tree_view->priv->in_scroll = TRUE;
- gdk_window_scroll (tree_view->priv->bin_window, 0, dy);
- tree_view->priv->in_scroll = FALSE;
if (dy != 0)
{
}
}
+
+ gtk_widget_queue_draw (GTK_WIDGET (tree_view));
}
-\f
+
/* Public methods
*/
gtk_tree_view_set_headers_visible (GtkTreeView *tree_view,
gboolean headers_visible)
{
- gint x, y;
GList *list;
GtkTreeViewColumn *column;
GtkWidget *button;
if (gtk_widget_get_realized (GTK_WIDGET (tree_view)))
{
- gdk_window_get_position (tree_view->priv->bin_window, &x, &y);
if (headers_visible)
{
- height = gtk_widget_get_allocated_height (GTK_WIDGET (tree_view));
- gdk_window_move_resize (tree_view->priv->bin_window,
- x, y + gtk_tree_view_get_effective_header_height (tree_view),
- tree_view->priv->width, height - gtk_tree_view_get_effective_header_height (tree_view));
-
if (gtk_widget_get_mapped (GTK_WIDGET (tree_view)))
gtk_tree_view_map_buttons (tree_view);
}
else
{
- gdk_window_move_resize (tree_view->priv->bin_window, x, y, tree_view->priv->width, gtk_tree_view_get_height (tree_view));
for (list = tree_view->priv->columns; list; list = list->next)
{
if (column)
*column = NULL;
- if (tree_view->priv->bin_window == NULL)
- return FALSE;
-
if (tree_view->priv->tree == NULL)
return FALSE;
if (path)
*path = NULL;
- if (tree_view->priv->bin_window == NULL)
- return FALSE;
-
if (tree_view->priv->tree == NULL)
return FALSE;
gint x = 1, y = 1;
cairo_surface_t *surface;
gint bin_window_width;
+ gint bin_window_height;
gboolean is_separator = FALSE;
gboolean rtl;
cairo_t *cr;
background_area.y = y;
background_area.height = gtk_tree_view_get_row_height (tree_view, node);
- bin_window_width = gdk_window_get_width (tree_view->priv->bin_window);
+ gtk_widget_get_content_size (GTK_WIDGET (tree_view), &bin_window_width, &bin_window_height);
- surface = gdk_window_create_similar_surface (tree_view->priv->bin_window,
+ surface = gdk_window_create_similar_surface (gtk_widget_get_window (GTK_WIDGET (tree_view)),
CAIRO_CONTENT_COLOR,
bin_window_width + 2,
background_area.height + 2);